home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / CPP / WFC010.ZIP / SRC / CNETSESS.CPP < prev    next >
C/C++ Source or Header  |  1995-12-07  |  9KB  |  345 lines

  1. #include <wfc.h>
  2. #pragma hdrstop
  3.  
  4. /*
  5. ** Author: Samuel R. Blackburn
  6. ** CI$: 76300,326
  7. ** Internet: sammy@sed.csc.com
  8. **
  9. ** You can use it any way you like as long as you don't try to sell it.
  10. **
  11. ** Any attempt to sell WFC in source code form must have the permission
  12. ** of the original author. You can produce commercial executables with
  13. ** WFC but you can't sell WFC.
  14. **
  15. ** Copyright, 1995, Samuel R. Blackburn
  16. **
  17. ** $Workfile: $
  18. ** $Revision: $
  19. ** $Modtime: $
  20. */
  21.  
  22. #if defined( _DEBUG )
  23. #undef THIS_FILE
  24. static char BASED_CODE THIS_FILE[] = __FILE__;
  25. #endif
  26.  
  27. IMPLEMENT_SERIAL( CNetworkSessions, CNetwork, 1 )
  28. IMPLEMENT_SERIAL( CNetworkSessionInformation, CObject, 1 )
  29.  
  30. #if defined( _DEBUG )
  31. #define new DEBUG_NEW
  32. #endif
  33.  
  34. CNetworkSessions::CNetworkSessions()
  35. {
  36.    m_Initialize();
  37. }
  38.  
  39. CNetworkSessions::CNetworkSessions( LPCTSTR machine_name )
  40. {
  41.    Open( machine_name );
  42. }
  43.  
  44. CNetworkSessions::~CNetworkSessions()
  45. {
  46.    Close();
  47. }
  48.  
  49. void CNetworkSessions::Close( void )
  50. {
  51.    CNetwork::Close();
  52.    m_Initialize();
  53. }
  54.  
  55. BOOL CNetworkSessions::Delete( CNetworkSessionInformation& information )
  56. {
  57.    WCHAR wide_user_name[ 256 ];
  58.    WCHAR wide_client_name[ 256 ];
  59.  
  60.    ::ZeroMemory( wide_user_name,   sizeof( wide_user_name   ) );
  61.    ::ZeroMemory( wide_client_name, sizeof( wide_client_name ) );
  62.  
  63.    LPWSTR user   = (LPWSTR) NULL;
  64.    LPWSTR client = (LPWSTR) NULL;
  65.  
  66.    if ( information.UserName.GetLength() > 0 )
  67.    {
  68. #if ! defined( UNICODE )
  69.       ::strcpy( (LPSTR) wide_user_name, information.UserName );
  70.       ::ASCII_to_UNICODE( (LPSTR) wide_user_name, wide_user_name );
  71. #else
  72.       ::strcpy( wide_user_name, information.UserName );
  73. #endif // UNICODE
  74.  
  75.       user = wide_user_name;
  76.    }
  77.  
  78.    if ( information.ClientName.GetLength() > 0 )
  79.    {
  80. #if ! defined( UNICODE )
  81.       ::strcpy( (LPSTR) wide_client_name, information.ClientName );
  82.       ::ASCII_to_UNICODE( (LPSTR) wide_client_name, wide_client_name );
  83. #else
  84.       ::strcpy( client_user_name, information.ClientName );
  85. #endif // UNICODE
  86.  
  87.       client = wide_client_name;
  88.    }
  89.  
  90.    m_ErrorCode = ::NetSessionDel( (LPTSTR) m_WideMachineName,
  91.                                   (LPTSTR) client,
  92.                                   (LPTSTR) user );
  93.    
  94.    if ( m_ErrorCode == NERR_Success )
  95.    {
  96.       return( TRUE );
  97.    }
  98.    else
  99.    {
  100.       return( FALSE );
  101.    }
  102. }
  103.  
  104. BOOL CNetworkSessions::Enumerate( CNetworkSessionInformation& information )
  105. {
  106.    SESSION_INFO_502 *information_p = (SESSION_INFO_502 *) NULL;
  107.  
  108.    SESSION_INFO_502 s;
  109.  
  110.    ::ZeroMemory( &s, sizeof( s ) );
  111.  
  112.    information_p = &s;
  113.  
  114.    DWORD prefered_maximum_length = sizeof( SESSION_INFO_502 ) * 128;
  115.    DWORD number_of_entries_read  = 0;
  116.    DWORD total_number_of_entries = 0;
  117.  
  118.    m_ErrorCode = ::NetSessionEnum( (LPTSTR) m_WideMachineName, 
  119.                                    (LPTSTR) NULL, 
  120.                                    (LPTSTR) NULL, 
  121.                                             502,
  122.                                 (LPBYTE *) &information_p,
  123.                                             prefered_maximum_length,
  124.                                            &number_of_entries_read,
  125.                                            &total_number_of_entries,
  126.                                            &m_ResumeHandle );
  127.  
  128.    if ( information_p != (SESSION_INFO_502 *) NULL )
  129.    {
  130.       information.Copy( information_p );
  131.       return( TRUE );
  132.    }
  133.  
  134.    return( FALSE );
  135. }
  136.  
  137. BOOL CNetworkSessions::GetNext( CNetworkSessionInformation& information )
  138. {
  139.    return( Enumerate( information ) );
  140. }
  141.  
  142. void CNetworkSessions::m_Get_0_Data( void )
  143. {
  144.    LPBYTE buffer = (LPBYTE) NULL;
  145.  
  146.    /*
  147.    ** One of the children got loose in the header files again...
  148.    **
  149.    ** Also, we can't get 101 information because it doesn't work if you supply
  150.    ** a machine name... Go Figure...
  151.    */
  152.  
  153.    ::NetSessionGetInfo( (LPTSTR) m_WideMachineName, NULL, NULL, 0, &buffer );
  154.  
  155.    if ( buffer != NULL )
  156.    {
  157.       SESSION_INFO_0 *information_p = (SESSION_INFO_0 *) buffer;
  158.  
  159. #if ! defined( UNICODE )
  160.       ::UNICODE_to_ASCII( (LPCWSTR) information_p->sesi0_cname, information_p->sesi0_cname );
  161. #endif
  162.  
  163.       /*
  164.       ** Now store the info we want...
  165.       */
  166.  
  167.       m_ServerName = information_p->sesi0_cname;
  168.       m_Retrieved0 = TRUE;
  169.    }
  170. }
  171.  
  172. void CNetworkSessions::m_Get_1_Data( void )
  173. {
  174. }
  175.  
  176. void CNetworkSessions::m_Get_2_Data( void )
  177. {
  178. }
  179.  
  180. void CNetworkSessions::m_Get_10_Data( void )
  181. {
  182. }
  183.  
  184. void CNetworkSessions::m_Get_502_Data( void )
  185. {
  186. }
  187.  
  188. void CNetworkSessions::m_Initialize( void )
  189. {
  190.    m_ServerName.Empty();
  191.    m_ClientName.Empty();
  192.  
  193.    m_Retrieved0   = FALSE;
  194.    m_Retrieved1   = FALSE;
  195.    m_Retrieved2   = FALSE;
  196.    m_Retrieved10  = FALSE;
  197.    m_Retrieved502 = FALSE;
  198.  
  199.    m_ErrorCode    = 0;
  200.    m_ResumeHandle = 0;
  201. }
  202.  
  203. void CNetworkSessions::Serialize( CArchive& archive )
  204. {
  205.    CNetwork::Serialize( archive );
  206. }
  207.  
  208. /*
  209. ** CSessionInformation stuff
  210. */
  211.  
  212. CNetworkSessionInformation::CNetworkSessionInformation()
  213. {
  214.    m_Initialize();
  215. }
  216.  
  217. /*
  218. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  219. ** net API header files...
  220. */
  221.  
  222. CNetworkSessionInformation::CNetworkSessionInformation( SESSION_INFO_502 *source )
  223. {
  224.    Copy( source );
  225. }
  226.  
  227. CNetworkSessionInformation::CNetworkSessionInformation( const CNetworkSessionInformation& source )
  228. {
  229.    Copy( source );
  230. }
  231.  
  232. CNetworkSessionInformation::~CNetworkSessionInformation()
  233. {
  234.    m_Initialize();
  235. }
  236.  
  237. /*
  238. ** Can't make Copy take a const pointer because Microsoft screwed up the 
  239. ** net API header files...
  240. */
  241.  
  242. void CNetworkSessionInformation::Copy( SESSION_INFO_502 *source )
  243. {
  244.    ASSERT( source != NULL );
  245.  
  246.    if ( source == NULL )
  247.    {
  248.       m_Initialize();
  249.       return;
  250.    }
  251.  
  252. #if ! defined( UNICODE )
  253.    ::UNICODE_to_ASCII( (LPCWSTR) source->sesi502_cname,       source->sesi502_cname       );
  254.    ::UNICODE_to_ASCII( (LPCWSTR) source->sesi502_username,    source->sesi502_username    );
  255.    ::UNICODE_to_ASCII( (LPCWSTR) source->sesi502_cltype_name, source->sesi502_cltype_name );
  256.    ::UNICODE_to_ASCII( (LPCWSTR) source->sesi502_transport,   source->sesi502_transport   );
  257. #endif
  258.  
  259.    ClientName     = source->sesi502_cname;
  260.    UserName       = source->sesi502_username;
  261.    ClientTypeName = source->sesi502_cltype_name;
  262.    Transport      = source->sesi502_transport;
  263.    NumberOfOpens  = source->sesi502_num_opens;
  264.    Time           = CTimeSpan( source->sesi502_time      );
  265.    IdleTime       = CTimeSpan( source->sesi502_idle_time );
  266.    UserFlags      = source->sesi502_user_flags;
  267.  
  268. #if ! defined( UNICODE )
  269.    ::ASCII_to_UNICODE( source->sesi502_cname,       (LPWSTR) source->sesi502_cname       );
  270.    ::ASCII_to_UNICODE( source->sesi502_username,    (LPWSTR) source->sesi502_username    );
  271.    ::ASCII_to_UNICODE( source->sesi502_cltype_name, (LPWSTR) source->sesi502_cltype_name );
  272.    ::ASCII_to_UNICODE( source->sesi502_transport,   (LPWSTR) source->sesi502_transport   );
  273. #endif
  274. }
  275.  
  276. void CNetworkSessionInformation::Copy( const CNetworkSessionInformation& source )
  277. {
  278.    ASSERT( this != &source );
  279.  
  280.    /*
  281.    ** Make sure we ain't copying ourselves
  282.    */
  283.  
  284.    if ( this == &source )
  285.    {
  286.       return;
  287.    }
  288.  
  289.    ClientName     = source.ClientName;
  290.    UserName       = source.UserName;
  291.    ClientTypeName = source.ClientTypeName;
  292.    Transport      = source.Transport;
  293.    NumberOfOpens  = source.NumberOfOpens;
  294.    Time           = source.Time;
  295.    IdleTime       = source.IdleTime;
  296.    UserFlags      = source.UserFlags;
  297. }
  298.  
  299. void CNetworkSessionInformation::Empty( void )
  300. {
  301.    m_Initialize();
  302. }
  303.  
  304. void CNetworkSessionInformation::m_Initialize( void )
  305. {
  306.    ClientName.Empty();
  307.    UserName.Empty();
  308.    ClientTypeName.Empty();
  309.    Transport.Empty();
  310.    NumberOfOpens = 0;
  311.    Time          = CTimeSpan( 0 );
  312.    IdleTime      = CTimeSpan( 0 );
  313.    UserFlags     = 0;
  314. }
  315.  
  316. void CNetworkSessionInformation::Serialize( CArchive& archive )
  317. {
  318.    CObject::Serialize( archive );
  319.  
  320.    if ( archive.IsStoring() )
  321.    {
  322.       archive << ClientName;
  323.       archive << UserName;
  324.       archive << NumberOfOpens;
  325.       archive << Time;
  326.       archive << IdleTime;
  327.       archive << UserFlags;
  328.       archive << ClientTypeName;
  329.       archive << Transport;
  330.    }
  331.    else
  332.    {
  333.       archive >> ClientName;
  334.       archive >> UserName;
  335.       archive >> NumberOfOpens;
  336.       archive >> Time;
  337.       archive >> IdleTime;
  338.       archive >> UserFlags;
  339.       archive >> ClientTypeName;
  340.       archive >> Transport;
  341.    }
  342. }
  343.  
  344.  
  345.